/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.ToggleEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKOrdenCompraSeg;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@Named(value = "MBOrdenCompraSeg")
@Scope("request")
public class MBOrdenCompraSeg extends MBGenerico implements Serializable {

    private static Logger logger = Logger.getLogger(MBOrdenCompra.class);
    @Inject
    private BKOrdenCompraSeg bkOrdenCompraSeg;
    @Inject
    private IServicioOrdenCompraServicio servicioOrdenCS;
    @Inject
    private IServicioGuiaRemision servicioGuia;
    @Autowired
    BKSession session;

    public MBOrdenCompraSeg() {
    }

    public String mostrarSeguimiento() {
        try {
            bkOrdenCompraSeg.inicializarValores();
            this.bkOrdenCompraSeg.setOrdenCcmpraSeg(servicioOrdenCS.conseguirOrdenCompraServicioPorId(this.bkOrdenCompraSeg.getOrdenCcmpraSeg().getId()));
            OrdenCompraServicio orden = this.bkOrdenCompraSeg.getOrdenCcmpraSeg();
            //int catDetalles = orden.getDetalleOrdenCompraServicioCollection().size();
            int cantidadGuias = orden.getGuiaRemisionCollection().size();
            if (cantidadGuias > 0 && orden.getEstadoOrden().equals("" + OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.getValor())) {
                List<GuiaRemision> lista = (List<GuiaRemision>) orden.getGuiaRemisionCollection();
                cantidadGuias--;
                while (cantidadGuias >= 0) {
                    GuiaRemision guia = lista.get(cantidadGuias);
                    if (guia.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                            && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                        this.bkOrdenCompraSeg.getOrdenCcmpraSeg().setFechaCierre(guia.getFechaInicioTraslado());
                        break;
                    }
                    cantidadGuias--;
                }

            }

            for (DetalleOrdenCompraServicio detalle : this.bkOrdenCompraSeg.getOrdenCcmpraSeg().getDetalleOrdenCompraServicioCollection()) {
                if (detalle.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    this.bkOrdenCompraSeg.getListaDetalleOCS().add(detalle);
                    detalle.setTotalRecibido(calcularTotales(detalle));
                }

            }
            /* for (GuiaRemision guia : orden.getGuiaRemisionCollection()) {
             for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
             if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
             && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
             this.bkOrdenCompraSeg.getListaDetalleGR().add(detalleGR);
                            
             }
             }
             if (this.bkOrdenCompraSeg.getOrdenCcmpraSeg().getEstadoOrden().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
             this.bkOrdenCompraSeg.getOrdenCcmpraSeg().setFechaCierre(guia.getFechaInicioTraslado());
             }

             }*/

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.OrdenCompraServicio.URL_SEGUIMIENTO_ORDEN_COMPRA;
    }

    public String cerrarOrden() {
        try {
            bkOrdenCompraSeg.getOrdenCcmpraSeg().setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.CERRADO.getValor());
            bkOrdenCompraSeg.getOrdenCcmpraSeg().setUsrModificacion(session.getUsuario().getUsuario());
            bkOrdenCompraSeg.getOrdenCcmpraSeg().setFecModificacion(new Date());
            servicioOrdenCS.actualizarOrdenCompraServicio(bkOrdenCompraSeg.getOrdenCcmpraSeg());
            mostrarMensaje("Se Finalizó la Orden de Compra " + bkOrdenCompraSeg.getOrdenCcmpraSeg().getCodigo() + " con éxito.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return mostrarSeguimiento();
    }

    public String anularOrden() {
        try {
            bkOrdenCompraSeg.getOrdenCcmpraSeg().setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor());
            bkOrdenCompraSeg.getOrdenCcmpraSeg().setUsrModificacion(session.getUsuario().getUsuario());
            bkOrdenCompraSeg.getOrdenCcmpraSeg().setFecModificacion(new Date());
            servicioOrdenCS.actualizarOrdenCompraServicio(bkOrdenCompraSeg.getOrdenCcmpraSeg());
            mostrarMensaje("Se anuló la Orden de Compra " + bkOrdenCompraSeg.getOrdenCcmpraSeg().getCodigo() + " con éxito.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return mostrarSeguimiento();
    }

    public BigDecimal calcularTotales(DetalleOrdenCompraServicio detalle) {
        BigDecimal cantidad = BigDecimal.ZERO;

        OrdenCompraServicio orden = this.bkOrdenCompraSeg.getOrdenCcmpraSeg();

        if (orden.getGuiaRemisionCollection().size() > 0) {
            for (GuiaRemision guia : orden.getGuiaRemisionCollection()) {
                if (guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                    for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
                        if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                                && detalleGR.getArticulo().getId().equals(detalle.getIdArticulo().getId())) {
                            if(guia.getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.ENTRADA)){
                                cantidad = cantidad.add(detalleGR.getCantidad());
                            }else{
                                cantidad = cantidad.subtract(detalleGR.getCantidad());
                            }
                            
                        }
                    }
                }
            }
        }

        return cantidad;
    }

    public void verDetalle(ToggleEvent event) throws ServiceException {
        DetalleOrdenCompraServicio detalle = (DetalleOrdenCompraServicio) event.getData();
        OrdenCompraServicio orden = this.bkOrdenCompraSeg.getOrdenCcmpraSeg();
        //int catDetalles = orden.getDetalleOrdenCompraServicioCollection().size();
        this.bkOrdenCompraSeg.getListaDetalleGR().clear();

        if (orden.getGuiaRemisionCollection().size() > 0) {
            for (GuiaRemision guia : orden.getGuiaRemisionCollection()) {
                guia = servicioGuia.conseguirGuiaDeRemisionPorId(guia.getId());
                if (guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
                    if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                            && detalleGR.getArticulo().getId().equals(detalle.getIdArticulo().getId())) {
                        this.bkOrdenCompraSeg.getListaDetalleGR().add(detalleGR);

                    }
                }
                }

            }
        }
    }
}
